with Parts; use Parts;
with Parts.Operations; use Parts.Operations;
with Coordinates; use Coordinates;
with Ada.Strings.Unbounded;
use Ada.Strings.Unbounded;

package Solver_Package is
   type Array_3ggr29 is private;

   procedure Put(A : in Array_3ggr29);
   --function Check_Duplicate(Temp_Part : in Part_Type; Part : in Part_Type;
   --                          Length : Integer) return Boolean;
   procedure Find_Possible_Positions(Part : in out Part_List.List_Pointer;
                                     Part_Number : in Integer;
                                     Full_Figure : in Part_List.List_Pointer;
                                     Figure_Number : in integer);

   procedure Find_All_Possible_Positions(Parts_List : in out Part_List.List_Pointer;
                                         Full_Figure : in out Part_List.List_Pointer;
                                         Figure_Number : in Integer);

   function Check_Intersection(Partial_Figure : in Coordinate_List.List_Pointer;
                               Coords : in Coordinate_List.List_Pointer)
                              return Boolean;

   function Try_To_Build_Figure_With_Parts(Parts_List : in Part_List.List_Pointer;
                                           Full_Figure : in Part_List.List_Pointer;
                                           Partial_Figure : in Part_List.List_Pointer)
                                          return Boolean;


    procedure R_To_Rotation_Angle(R : in Integer;
                          Theta_X : out Integer;
                          Theta_Y : out Integer;
                          Theta_Z : out Integer);

    function Solution_Message(List : in Part_List.List_Pointer)
                            return Unbounded_String;
   private
      type Array_3ggr29 is Array(1..3, 1..29) of Float;

end Solver_Package;

